package com.ciccwm.log.context;

import com.ciccwm.log.constant.LogConstant;
import org.slf4j.MDC;

/**
 * 链路追踪上下文.
 * 提供链路ID的存储和管理功能，支持在ThreadLocal和MDC中同时存储链路ID.
 * 用于在分布式系统中追踪请求的完整调用链，便于问题定位和日志关联.
 */
public final class TraceContext {
    /**
     * 线程本地存储的链路ID.
     * 用于在当前线程中存储和获取链路ID.
     */
    private static final ThreadLocal<String> TRACE_ID_HOLDER = new ThreadLocal<>();

    private TraceContext() {
        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
    }

    /**
     * 获取链路ID.
     * 从ThreadLocal中获取当前线程的链路ID.
     *
     * @return 当前线程的链路ID，如果不存在则返回null
     */
    public static String getTraceId() {
        return TRACE_ID_HOLDER.get();
    }

    /**
     * 设置链路ID.
     * 将链路ID同时存储到ThreadLocal和MDC中.
     * ThreadLocal用于线程内传递，MDC用于日志输出.
     *
     * @param traceId 要设置的链路ID
     */
    public static void setTraceId(String traceId) {
        TRACE_ID_HOLDER.set(traceId);
        MDC.put(LogConstant.TRACE_ID_KEY, traceId);
    }

    /**
     * 移除链路ID.
     * 同时从ThreadLocal和MDC中移除链路ID.
     * 通常在请求处理完成后调用，防止内存泄漏.
     */
    public static void removeTraceId() {
        TRACE_ID_HOLDER.remove();
        MDC.remove(LogConstant.TRACE_ID_KEY);
    }
} 
